//public class Test3 {
//    public static void main(String[] args) throws ExecutionException, InterruptedException {
////        new Thread(() -> System.out.println("Hello World")).start();
//        FutureTask<Integer> futureTask = new FutureTask<>(() -> 1 + 1);
//        new Thread(futureTask).start();
//        int result = futureTask.get();
//        System.out.println(result);
//    }
//}


//public class Test3 {
//    public static void main(String[] args) {
//        new Thread(() -> {
//            System.out.printf("%s is %s%n", Thread.currentThread().getName(), "Son Thread");
//            new Thread(() -> System.out.printf("%s is %s%n", Thread.currentThread().getName(), "Grandson Thread")).start();
//        }).start();
//
//        System.out.println(Thread.currentThread().getName() + " is Main Thread");
//    }
//}
//
//public class Test3 {
//    public static void main(String[] args) {
//        final int[] i = {10}; // 对于后面定义的 Runnable 类是可见的
//        Runnable handler = new Runnable() {
//            @Override
//            public void run() {
//                while (i[0] > 0) {
//                    System.out.println(Thread.currentThread().getName() + " i: " + --i[0]);
//                    try {
//                        Thread.sleep(10);
//                    } catch (InterruptedException e) {
//                        throw new RuntimeException(e);
//                    }
//                }
//            }
//        };
//        final int[] j = {100}; // 对于前面定义的 Runnable 类是不可见的
//
//        Thread t1 = new Thread(handler);
//        Thread t2 = new Thread(handler);
//        t1.start();
//        t2.start();
//        try {
//            t1.join();
//            t2.join();
//        } catch (InterruptedException e) {
//            throw new RuntimeException(e);
//        }
//    }
//}
//
//class TicketSaleRunnable implements Runnable {
//    private int ticket = 100;
//
//    public void run() {
//        while (ticket > 0) {
//            System.out.println(Thread.currentThread().getName() + "卖出一张票，票号:" + ticket);
//            ticket--;
//        }
//    }
//}

// 1、编写资源类
//class Ticket {
//    private int ticket = 100;
//
//    public void sale() {
//        if (ticket > 0) {
//            try {
//                Thread.sleep(10);//加入这个，使得问题暴露的更明显
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            System.out.println(Thread.currentThread().getName() + "卖出一张票，票号:" + ticket);
//            ticket--;
//        } else {
//            throw new RuntimeException("没有票了");
//        }
//    }
//
//    public int getTicket() {
//        return ticket;
//    }
//}
//
//public class Test3 {
//    public static void main(String[] args) {
//        // 2、创建资源对象
//        Ticket ticket = new Ticket();
//
//        // 3、启动多个线程操作资源类的对象
//        Thread t1 = new Thread("窗口一") {
//            public void run() {
//                while (true) {
//                    ticket.sale();
//                }
//            }
//        };
//        Thread t2 = new Thread("窗口二") {
//            public void run() {
//                while (true) {
//                    ticket.sale();
//                }
//            }
//        };
//        Thread t3 = new Thread(new Runnable() {
//            public void run() {
//                ticket.sale();
//            }
//        }, "窗口三");
//
//        t1.start();
//        t2.start();
//        t3.start();
//    }
//}